package com.qsl.ssyx;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池- 线程串行化方法:
 * thenApply 方法：当一个线程依赖另一个线程时，获取上一个任务返回的结果，并返回当前任务的返回值。
 * thenAccept方法：消费处理结果。接收任务的处理结果，并消费处理，无返回结果。
 * thenRun方法：只要上面的任务执行完成，就开始执行thenRun，只是处理完任务后，执行 thenRun的后续操作
 * ======》 本次为thenApply
 */
public class CompletableFutureDemo4 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建线程-线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        System.out.println(" main begin...");

        // 任务A: 返回结果-1024
        CompletableFuture<Integer> futureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程名称为： " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000); // 暂停1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int result = 1024;
            System.out.println("任务A: " + result);
            return result;
        }, executorService);
        System.out.println("futureA返回结果: " + futureA.get());

        // 任务B: 获取任务A结果，并返回
        CompletableFuture<Object> futureB = futureA.thenApplyAsync((val) -> {
            System.out.println("任务B: " + val);
            return val;
        }, executorService);
        System.out.println("futureB返回结果: " + futureB.get());

        // 任务C: 等待任务A，再执行。
        futureA.thenRunAsync(() -> {
            System.out.println("任务C");
        }, executorService);
    }
}
